#include "LobbyStagingPrv.h"

#include "StagingLogic.h"
#include "LanLogic.h"
#include "LobbyConfig.h"
#include "LobbyGame.h"
#include "LobbyMisc.h"
#include "LobbyResource.h"
#include "LobbyScreen.h"
#include "LobbyTypes.h"
#include "RoutingLogic.h"
#include "WONLobbyPrv.h"

#include "WONCommon/WriteBuffer.h"
#include "WONGUI/Container.h"

using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NetLogic* LobbyStagingPrv::GetNetLogic(LobbyGameType theType)
{
	if(gLobbyData.get()==NULL)
		return NULL;

	switch(theType)
	{
		case LobbyGameType_Internet: return gLobbyData->mRoutingLogic;
		case LobbyGameType_Lan:
		case LobbyGameType_DirectConnect: return gLobbyData->mLanLogic;

		default: return NULL;
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NetLogic* LobbyStagingPrv::GetNetLogic()
{
	if(gLobbyData.get()==NULL)
		return NULL;
	else
		return GetNetLogic(gLobbyData->mCurGameType);
}


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool LobbyStagingPrv::NetCreateGame(LobbyGame *theGame)
{
	if(gLobbyData.get()==NULL)
		return false;

	gLobbyData->mCurGameType = theGame->GetGameType();
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		return aLogic->NetCreateGame(theGame);
	else
		return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool LobbyStagingPrv::NetJoinGame(LobbyGame *theGame)
{
	if(gLobbyData.get()==NULL)
		return false;

	gLobbyData->mCurGameType = theGame->GetGameType();
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		return aLogic->NetJoinGame(theGame);
	else
		return false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
LobbyClient* LobbyStagingPrv::NetGetMyClient()
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic==NULL)
		return NULL;
	else
		return aLogic->NetGetMyClient();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetSendGameMessageToCaptain(const ByteBuffer *theMsg)
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetSendGameMessageToCaptain(theMsg);

}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetBroadcastGameMessage(const ByteBuffer *theMsg)
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetBroadcastGameMessage(theMsg);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetSendGameMessageToClient(LobbyClient *theClient, const ByteBuffer *theMsg)
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetSendGameMessageToClient(theClient,theMsg);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetDeleteGameSummary(LobbyGame *theGame)
{
	NetLogic *aLogic = GetNetLogic(theGame->GetGameType());
	if(aLogic!=NULL)
		aLogic->NetDeleteGameSummary(theGame);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetLeaveGame(LobbyGame *theGame)
{
	NetLogic *aLogic = GetNetLogic(theGame->GetGameType());
	if(aLogic!=NULL)
		aLogic->NetLeaveGame(theGame);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetKickClient(LobbyClient *theClient, bool isBan)
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetKickClient(theClient,isBan);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetCloseGame(bool close)
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetCloseGame(close);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetSuspendLobby()
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetSuspendLobby();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetResumeLobby()
{
	NetLogic *aLogic = GetNetLogic();
	if(aLogic!=NULL)
		aLogic->NetResumeLobby();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NetLogout()
{
	if(gLobbyData.get()==NULL)
		return;

	if(LobbyScreen::OnInternetScreen())
		gLobbyData->mRoutingLogic->NetLogout();
	else if(LobbyScreen::OnLanScreen())
		gLobbyData->mLanLogic->NetLogout();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::HandleGameMessage(const ByteBuffer *theMsg, LobbyClient *theClient)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mStagingLogic->HandleGameMessage(theMsg,theClient);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::HandleGameMessage(ReadBuffer &theMsg, LobbyClient *theClient)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mStagingLogic->HandleGameMessage(theMsg,theClient);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NotifyGameDisconnect(bool showErrorDlg)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mStagingLogic->NotifyGameDisconnect(showErrorDlg);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NotifyClientLeftGame(LobbyClient *theClient)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mStagingLogic->NotifyClientLeftGame(theClient);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NotifyClientKicked(LobbyClient *theClient, bool isBan)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mStagingLogic->NotifyClientKicked(theClient,isBan);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::NotifyPingChange(LobbyGame *theGame)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mStagingLogic->NotifyPingChange(theGame);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void LobbyStagingPrv::EnterInternetScreen(bool joinDefaultRoom)
{
	if(gLobbyData.get()!=NULL)
		gLobbyData->mRoutingLogic->EnterInternetScreen(joinDefaultRoom);
}

